/**
 * @license
 * Copyright (C) 2017 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

import {PatchSetBehavior} from '../../../behaviors/gr-patch-set-behavior/gr-patch-set-behavior.js';

/**
 * @constructor
 * @param {Object} change A change object resulting from a change detail
 *     call that includes revision information.
 */
export function RevisionInfo(change) {
  this._change = change;
}

/**
 * Get the largest number of parents of the commit in any revision. For
 * example, with normal changes this will always return 1. For merge changes
 * wherein the revisions are merge commits this will return 2 or potentially
 * more.
 *
 * @return {number}
 */
RevisionInfo.prototype.getMaxParents = function() {
  if (!this._change || !this._change.revisions) {
    return 0;
  }
  return Object.values(this._change.revisions)
      .reduce((acc, rev) => Math.max(rev.commit.parents.length, acc), 0);
};

/**
 * Get an object that maps revision numbers to the number of parents of the
 * commit of that revision.
 *
 * @return {!Object}
 */
RevisionInfo.prototype.getParentCountMap = function() {
  const result = {};
  if (!this._change || !this._change.revisions) {
    return {};
  }
  Object.values(this._change.revisions)
      .forEach(rev => { result[rev._number] = rev.commit.parents.length; });
  return result;
};

/**
 * @param {number|string} patchNum
 * @return {number}
 */
RevisionInfo.prototype.getParentCount = function(patchNum) {
  return this.getParentCountMap()[patchNum];
};

/**
 * Get the commit ID of the (0-offset) indexed parent in the given revision
 * number.
 *
 * @param {number|string} patchNum
 * @param {number} parentIndex (0-offset)
 * @return {string}
 */
RevisionInfo.prototype.getParentId = function(patchNum, parentIndex) {
  const rev = Object.values(this._change.revisions).find(rev =>
    PatchSetBehavior.patchNumEquals(rev._number, patchNum));
  return rev.commit.parents[parentIndex].commit;
};
